<?php
//	file:  HcenterMemberModel.class.php
//	time:  Jan 12, 2016 1:59:24 PM

namespace Have\Model;

use Think\Model;
use Think\Log;
class UcenterMemberModel extends Model{
    
    /**
     * 数据表前缀
     * @var string
     */
    protected $tablePrefix = HUC_TABLE_PREFIX;
    
    /**
     * 数据库连接
     * @var string
     */
    protected $connection = HUC_DB_DSN;
    
    /* 用户模型自动验证 */
    protected $_validate = array(
        /* 验证用户名 */
        array('username', '1,30', -1, self::EXISTS_VALIDATE, 'length'), // 用户名长度不合法
        array('username', 'checkDenyMember', -2, self::EXISTS_VALIDATE, 'callback'), // 用户名禁止注册
        array('username', '', -3, self::EXISTS_VALIDATE, 'unique'), // 用户名被占用
        
        /* 验证密码 */
        array('password', '4,30', -4, self::EXISTS_VALIDATE, 'length'), // 密码长度不合法
        
        /* 验证邮箱 */
        array('email', 'email', -5, self::EXISTS_VALIDATE), // 邮箱格式不正确
        array('email', '1,32',-6, self::EXISTS_VALIDATE, 'length'), // 邮箱长度不合法
        array('email', 'checkDenyEmail', -7, self::EXISTS_VALIDATE, 'callback'), // 邮箱禁止注册
        array('email', '', -8, self::EXISTS_VALIDATE, 'unique'), // 邮箱被占用
        
        /* 验证手机号 */
        array('mobile', '//', -9, self::EXISTS_VALIDATE), // 手机格式不正确 TODO:
        array('mobile', 'checkDenyMobile', -10, self::EXISTS_VALIDATE, 'callback'), // 手机禁止注册
        array('mobile', '', -11, self::EXISTS_VALIDATE, 'unique'), // 手机号被占用
    );
    
    /* 用户模型自动完成 */
    protected $_auto = array(
        array('password', 'have_ucenter_md5', self::MODEL_BOTH, 'function', HUC_AUTH_KEY),
        array('authory', 'intval', self::MODEL_BOTH, 'function'),
        array('reg_time', NOW_TIME, self::MODEL_INSERT),
        array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'function', 1),
        array('update_time', NOW_TIME),
        array('status', 'getStatus', self::MODEL_BOTH, 'callback'),
    );
    
    /**
     * 检测用户名是不是被禁注册
     * @param string $username 用户名
     * @return boolean true - 未禁用, false - 禁止注册
     */
    protected function checkDenyMember($username) {
        return true; // TODO：暂不限制，后期完善
    }
    
    /**
     * 检测邮箱是不是被禁止注册
     * @param string $email 邮箱
     * @return boolean true - 未禁用, false - 禁止注册
     */
    protected function checkDenyEmail($email){
        return true; // TODO: 暂不限制，后期完善
    }
    
    /**
     * 检测手机是不是被禁止注册
     * @param string $mobile 手机
     * @return boolean true - 未禁用， false - 禁止注册
     */
    protected function checkDenyMobil($mobile){
        return true; // TODO: 暂不限制，后期完善
    }
    
    /**
     * 根据配置指定用户状态
     * @return integer 用户状态
     */
    protected function getStatus(){
        return true; // TODO: 暂不限制，后期完善
    }
    
    /**
     * 注册一个用户
     * @param string $username 用户名
     * @param string $password 用户密码
     * @param string $email 用户邮箱 
     * @param string $mobile 用户手机号码
     * @return integer    注册成功-用户信息，注册失败-错误编号
     */
    public function register($username, $password, $email, $authory, $mobile) {
        $data = array(
            'username' => $username,
            'password' => $password,
            'email'     => $email,
            'mobile'    => $mobile,
            'authory'   => $authory,
        );
        
        //验证邮箱
        if (empty($data['email']))
            unset($data['email']);
        
        // 验证手机
        if (empty($data['mobile']))
            unset($data['mobile']);
       
         /* 添加用户 */
         if ($this->create($data)) {
             Log::record(print_r($data, true));
             $uid = $this->add();
             return $uid ? $uid : 0; // 0-未知错误, 大于0-注册成功
         } else {
             return $this->getError(); // 错误详情见自动验证注释
         }
    }
    
    /**
     * 用户登录认证
     * @param string $username 用户名
     * @param string $password 用户密码
     * @param integer $type 用户名类型(1-用户名,2-邮箱，3-手机,4-UID,5-手机验证，6-APP短信认证0
     * @return integer          登录成功-用户ID，登录失败-错误编号
     */
    public function login($username, $password, $type = 1) {
        $map = array();
        switch ($type) {
            case 1:
                $map['username'] = $username;
                break;
            case 2:
                $map['email'] = $username;
                break;
            case 3:
                $map['mobile'] = $username;
                break;
            case 4:
                $map['id'] = $username;
                break;
            case 5:
            case 6:
                $map['mobile'] = $username;
                break;
            default:
                return 0; // 参数错误
        }
        
        /* 获取用户数据 */
        $user = $this->where($map)->find();
        if (is_array($user) && $user['status']){
            /* 验证用户密码 */
            if(have_ucenter_md5($password, HUC_AUTH_KEY) === $user['password']){
                $this->updateLogin($user['id']); // 更新用户登录信息
                return $user['id']; // 登录成功，返回用户ID
            } else {
                return -2; // 密码错误
            }
        } else {
            return -1; // 用户不存在或被禁用
        }
    }
    
    public function logout(){
        session('user_auth', null);
        session('user_auth_sign', null);
    }
    
    /**
     * 更新用户登录信息
     * @param integer $uid 用户ID
     */
    protected function updateLogin($uid) {
        $data = array(
            'id'    => $uid,
            'last_login_time' => NOW_TIME,
            'last_login_ip'   => get_client_ip(1),
        );
        $this->save($data);
    }
    
    public function relogin($uid) {
        $user = $this->field(true)->find($uid);
        
        if (!$user || 1 != $user['status']) {
            $this->error = '用户不存在或已被禁用！';
            return false;
        }
        
        $auth = array(
            'uid'  => $uid,
            'username' => $user['username'],
            'authory' => $user['authory'],
            'last_login_time' => $user['last_login_time'],
        );
        session('user_auth', $auth);
        session('user_auth_sign', data_auth_sign($auth));
        
        return true;
    }
    
    /**
     * 更新用户信息
     * @param int $uid 用户 id
     * @param string $password 密码，用来验证
     * @param array $data 修改的字段数组
     * @return true 修改成功 false 修改失败
     */
    public function updateUserFields($uid, $password, $data) {
        if (empty($uid) || empty($password) || empty($data)) {
            $this->error = '参数错误';
            return false;
        }
        
        // 更新前检查用户密码
        
        if (!$this->verifyUser($uid, $password)) {
            $this->error = '验证出错：密码不正确！';
            return false;
        }
        
        // 更新用户信息
        $data = $this->create($data);
        if ($data) {
            return $this->where(array('id'=>$uid))->save($data);
        }
        
        return false;
    }
    
    /**
     * 验证用户密码
     * @param int $uid 用户id
     * @param string $password_in 密码
     * @return boolean true 验证成功，false 验证失败
     */
    protected function verifyUser($uid, $password_in) {
        $password = $this->getFieldById($uid, 'password');
        if (have_ucenter_md5($password_in, HUC_AUTH_KEY) === $password) {
            return true;
        }
        return false;
    }
}
?>
